; Mouse.TXT Copyright (C) 1989 Level 9 Computing.
;
;-----

;var

begin

.DisplayMouse
push v1
push v2
&vblx1=WordWS(WordCursorXPos)
push vblx1
&vblx1=WordWS(WordCursorYPos)
push vblx1
; save list 19 ptr
&vblX1=list11(76) ; list 19's ptr
push vblX1
&vblX1=list11(78)
push vblX1
&vblX1=list11(80) ; list 20's ptr
push vblX1
&vblX1=list11(82)
push vblX1

; display mouse ptr (a single pixel)
 vblX1=Mousex
; vblX2=16
; sub vblX1,vblX2
 vblX2=65520 ; $fff0 - i.e. word boundaries only, please.
 and vblX1,vblX2
code -
code +
 &WordWS(WordCursorXPos)=vblX1
 &WordWS(WordCursorYPos)=MouseY
 v1=19 ; logical base in list 19
 v2=20 ; physical base in list 20
 gosub @MCCalcScreenAddress ; get list20 as address on physical screen
 vblX1=MouseX
 vblX2=15
 and vblX1,vblX2
 gosub @CalcPixelMaskvblX1
 &vblX1=list19(0) ;* &vblX1=list20(0)
 or vblX1,vblX3
 &list19(0)=vblX1 ;* &list20(0)=vblX1
 &vblX1=list19(2) ;* &vblX1=list20(2)
 or vblX1,vblX3
 &list19(2)=vblX1 ;* &list20(2)=vblX1
pop vblX1
&list11(82)=vblX1 ; list 20's ptr
pop vblX1
&list11(80)=vblX1

pop vblX1
&list11(78)=vblX1 ; list 19's ptr
pop vblX1
&list11(76)=vblX1

pop vblX1
&WordWS(WordCursorYPos)=vblX1
pop vblX1
&WordWS(WordCursorXPos)=vblX1
pop v2
pop v1
 return

;-----

.DisplayPhysicalMouse
push v1
push v2
&vblx1=WordWS(WordCursorXPos)
push vblx1
&vblx1=WordWS(WordCursorYPos)
push vblx1
; save list 19 ptr
&vblX1=list11(76) ; list 19's ptr
push vblX1
&vblX1=list11(78)
push vblX1
&vblX1=list11(80) ; list 20's ptr
push vblX1
&vblX1=list11(82)
push vblX1

; display mouse ptr (a single pixel)
 vblX1=Mousex
; vblX2=16
; sub vblX1,vblX2
 vblX2=65520 ; $fff0 - i.e. word boundaries only, please.
 and vblX1,vblX2
code -
code +
 &WordWS(WordCursorXPos)=vblX1
 &WordWS(WordCursorYPos)=MouseY
 v1=19 ; logical base in list 19
 v2=20 ; physical base in list 20
 gosub @MCCalcScreenAddress ; get list20 as address on physical screen
 vblX1=MouseX
 vblX2=15
 and vblX1,vblX2
 gosub @CalcPixelMaskvblX1
 &vblX1=list20(0)
 or vblX1,vblX3
 &list20(0)=vblX1
 &vblX1=list20(2)
 or vblX1,vblX3
 &list20(2)=vblX1
pop vblX1
&list11(82)=vblX1 ; list 20's ptr
pop vblX1
&list11(80)=vblX1

pop vblX1
&list11(78)=vblX1 ; list 19's ptr
pop vblX1
&list11(76)=vblX1

pop vblX1
&WordWS(WordCursorYPos)=vblX1
pop vblX1
&WordWS(WordCursorXPos)=vblX1
pop v2
pop v1
 return

;-----

.Display4Pixels
;push v1
;push v2
;&vblx1=WordWS(WordCursorXPos)
;push vblx1
;&vblx1=WordWS(WordCursorYPos)
;push vblx1
; save list 19 ptr
;&vblX1=list11(76) ; list 19's ptr
;push vblX1
;&vblX1=list11(78)
;push vblX1
;&vblX1=list11(80) ; list 20's ptr
;push vblX1
;&vblX1=list11(82)
;push vblX1

; display mouse ptr (a single pixel)
 vblX1=Mousex
 vblX2=65520 ; $fff0 - i.e. word boundaries only, please.
 and vblX1,vblX2
code -
code +
 gosub PlotLogicalShape
 add MouseX,c1
 vblX1=Mousex
 vblX2=65520 ; $fff0 - i.e. word boundaries only, please.
 and vblX1,vblX2
 gosub PlotLogicalShape
 sub MouseX,c1
 add MouseY,c1
 vblX1=Mousex
 vblX2=65520 ; $fff0 - i.e. word boundaries only, please.
 and vblX1,vblX2
code -
code +
 gosub PlotLogicalShape
 add MouseX,c1
 vblX1=Mousex
 vblX2=65520 ; $fff0 - i.e. word boundaries only, please.
 and vblX1,vblX2
 gosub PlotLogicalShape

;pop vblX1
;&list11(82)=vblX1 ; list 20's ptr
;pop vblX1
;&list11(80)=vblX1

;pop vblX1
;&list11(78)=vblX1 ; list 19's ptr
;pop vblX1
;&list11(76)=vblX1

;pop vblX1
;&WordWS(WordCursorYPos)=vblX1
;pop vblX1
;&WordWS(WordCursorXPos)=vblX1
;pop v2
;pop v1
 return

.PlotLogicalShape
 &WordWS(WordCursorXPos)=vblX1
 &WordWS(WordCursorYPos)=MouseY
 v1=19 ; logical base in list 19
 v2=20 ; physical base in list 20
 gosub @MCCalcScreenAddress ; get list20 as address on physical screen
 vblX1=MouseX
 vblX2=15
 and vblX1,vblX2
 gosub @CalcPixelMaskvblX1
 &vblX1=list19(0)
 or vblX1,vblX3
 &list19(0)=vblX1
 &vblX1=list19(2)
 or vblX1,vblX3
 &list19(2)=vblX1
 return

;-----